package com.itheima.book.manager.dao;

import com.itheima.book.manager.domain.Book;

/**
 * 完成数据的增删改查操作(使用数组进行存储图书信息),供Service层调用
 */
public class BookDao implements BaseBookDao {

    // 0. 创建一个数组对象
    /**
     * 被static修饰的成员可以被该类的所有对象所共享
     */
    private static Book[] books = new Book[5] ;        // 为了让我们BookDao中的所有方法都可以进行访问，我们就需要将这个数组定义成成员变量

    /**
     * 先查找到要修改的图书信息对应的索引，把新的图书信息放置到当前索引这个位置
     */
    public void updateBookByBookId(Book book) {

        // 先查找到要修改的图书信息对应的索引
        // 定义一个变量，记录这个索引
        int index = -1 ;
        for(int x = 0 ; x < books.length ; x++) {
            Book bookInArr = books[x] ;
            if(bookInArr != null) {

                // 判断当前遍历的元素的id和传递过来的bookId是否相等
                if(bookInArr.getBookId().equals(book.getBookId())) {
                    index = x ;
                    break;
                }

            }
        }

        // 把新的图书信息放置到当前索引这个位置
        if(index != -1) {
             books[index] = book ;
        }

    }


    /**
     * 定义删除图书的方法(deleteByBookId)
     * BookService在调用这个deleteByBookId方法的时候，需要传递一个bookId
     * 就是把这个bookId所所对应的元素的值改成null
     *
     * 遍历数组获取每一个元素，然后判断当前遍历的这个元素的bookId的值是否和传递过来的bookId相等，如果相等这个索引
     */
    public void deleteByBookId(String bookId) {

        // 定义一个变量
        int index = -1 ;

        // 遍历数组获取每一个元素
        for(int x = 0 ; x < books.length ; x++) {
            Book bookInArr = books[x] ;
            if(bookInArr != null) {
                if(bookInArr.getBookId().equals(bookId)) {
                    index = x ;
                    break;
                }
            }
        }

        // 把index索引处的元素值设置为null
        if(index != -1) {
           books[index] = null ;
        }

    }


    // 定义一个获取所有图书信息的方法
    public Book[] getAllBooks() {
        return books ;
    }

    /**
     * 定义方法(addBook)将BookService传递过来图书信息存储到数组中
     * 怎么把Book对象的数据存储到数组中？
     *
     * 我们现在使用的数组是用来存储Book对象，那么我们就需要创建一个数组对象
     * Book[] books = new Book[5] ;
     *
     * 把Book对象存储到数组中的时候肯定需要存储到某一个位置，存储到哪一个位置呢？
     * 如果说某一个位置没有元素，我们就将其存储到该位置。怎么判断某一个位置有没有元素?
     *
     * 如果某一个位置的元素是null，就说明当前位置没有数据。我们就把这个Book对象存储到该位置
     *
     * 1. 获取数组元素为null的索引值
     * 2. 将Book数据存储到该索引位置
     * 3. 如果数组已经存满返回false
     *
     */
    public boolean addBook(Book book) {

        // 1. 获取数组元素为null的索引值
        // 1.1 定义一个变量，用来记录元素为null的索引值
        int index = -1 ;

        // 1.2 遍历这个数组，获取每一个元素，然后判断元素是否为null，如果为null,就把当前元素所对应的索引值赋值给变量，结束循环
        for(int x = 0 ; x < books.length ; x++) {
            Book bookArray = books[x] ;
            if(bookArray == null) {
                index = x ;
                break;
            }
        }

        // 将Book数据存储到该索引位置
        if(index != -1) {
            books[index] =book ;
            return true ;
        }

        // 如果数组已经存满返回false
        return false ;

    }



}
